package cn.tedu

import scala.io.{BufferedSource, Source}

/**
 * @author Amos
 * @date 2022/5/18
 */

object WordCount {
  def main(args: Array[String]): Unit = {
    val lines: List[String] = Source.fromFile("SCALADEMO/data/wordcount.txt").getLines().toList

    println(lines)
    println("*" * 50)

    val list = lines.flatMap(_.split(" "))
    println(list)

    println(list.groupBy((x) => {
      x
    }))

    println(list.groupBy(x => x).mapValues(_.size))

    println("*" * 50)
    val words: List[String] = lines.flatMap(_.split(" ")) // List(hello, scala, hello, flink, hello, hadoop, hello, scala, hello, flink
    // 进行数据转换，型号才能每一个词出现一次
    val wordAndOne = words.map((_,1))
    // Map(flink -> List((flink,1),(flink,1),(flink,1)),hadoop -> ...)
    val groupedWords: Map[String, List[(String, Int)]] = wordAndOne.groupBy(_._1)
//    val result = groupedWords.map(kv => (kv._1, kv._2.length))
//    println(result) // Map(flink -> 3, hadoop -> 4, scala -> 6, flume -> 1, hello -> 14, hbase -> 2)

    //  第二种方式：直接累加
//    val result = groupedWords.map(kv => (kv._1,kv._2.map(_._2).sum))
//    println(result)

    // 第三种方式，使用mapValues方法完成，mapValues主要是用于直接操作k-v中的value
    val result = groupedWords.mapValues(_.map(_._2).sum)
    println(result)

    // 求TOPN：top3取3个词出现频率最高的 take(n:Int) 表示提取n个元素
    val top3 = result.toList.sortBy(_._2)(Ordering[Int].reverse).take(3)
    println(top3)

    println("*" * 50)

    // 一气呵成
    println(lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1))
    println(lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.length))
    println(lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).map(kv => {(kv._1,kv._2.map(_._2).sum)}))

  }

}
